function convertToUpperCase(name) {
    let a = name.toUpperCase();
    return a;
}

let result = convertToUpperCase("zs");
console.log(result); 

let isDone: boolean = true;
let decimal: number = 6;
let name1: string = "TypeScript";
let list1: number[] = [1, 2, 3];
let list2: Array<string> = ["a", "b", "c"];
let x: [string, number] = ["hello", 10];
// ‌enum（枚举类型）‌：为一组数值赋予友好名称，默认从 0 开始编号，也可手动赋值
enum Color { Red, Green, Blue }
let c: Color = Color.Green; // 值为 1
// ‌any（任意类型）‌：表示任意类型，关闭类型检查，可赋值为任何类型。
let notSure: any = 4;
notSure = "maybe a string";
notSure = false;
// ‌void（空类型）‌：表示没有返回值的函数，或只能赋值 undefined 和 null 的变量。
function warnUser(): void {
  console.log("This is a warning");
}
let unusable: void = undefined;
// ‌null 和 undefined‌：分别表示空值和未定义，默认是所有类型的子类型。
let u: undefined = undefined;
let n: null = null;
// ‌never（永不存在类型）‌：表示永不存在的值的类型，如抛出异常或无限循环的函数返回值。
function error(message: string): never {
  throw new Error(message);
}
// ‌object（对象类型）‌：表示非原始类型（即除 number、string、boolean、symbol、null 或 undefined 之外的类型）。
let obj: object = { name: "John" };
// ‌symbol（符号类型）‌：表示唯一且不可变的值，用于创建对象的唯一属性名。
let sym1 = Symbol("key");
let sym2 = Symbol("key");
console.log(sym1 === sym2); // false
// ‌联合类型（Union Types）‌：表示取值可以为多种类型中的一种，使用 | 分隔。
let value: string | number;
value = "hello"; // 合法
value = 42; // 合法
// ‌交叉类型（Intersection Types）‌：表示将多个类型合并为一个类型，使用 & 连接。
type A = { name: string };
type B = { age: number };
type C = A & B; // { name: string; age: number }
// type A = { name: string }; 
// 是 TypeScript 中的类型别名声明，用于定义一个名为 A 的对象类型，该类型要求对象必须包含一个名为 name 且类型为 string 的属性。
// 定义类型别名 A
// type A = { name: string };
// 正确使用 - 符合类型要求
// const user1: A = { name: "张三" };
// ‌字面量类型（Literal Types）‌：表示取值只能是特定的字面量值。
type Direction = "up" | "down" | "left" | "right";
let dir1: Direction = "up"; // 只能取指定值



// =============  10. 索引与映射  =============
type Arr = number[];
type Dict = { [key: string]: boolean };
type RO = Readonly<{ x: number }>;
type Part = Partial<{ y: string; z: number }>;

// =============  11. 常用工具类型（TS 内置）  =============
type N = NonNullable<string | null>;
type R = ReturnType<typeof parseInt>;
type P = Parameters<typeof parseInt>;

// =============  12. 模板字符串类型  =============
type EventName<T extends string> = `${T}Changed`;
type E = EventName<'foo'>; // "fooChanged"

// =============  13. 类与接口  =============
class Point { x!: number; y!: number; }
interface IPoint { x: number; y: number; }
const pt: IPoint = new Point();

// =============  14. 泛型  =============
type Stack<T> = { push(item: T): void; pop(): T | undefined };
const numStack: Stack<number> = { push: () => {}, pop: () => 0 };

// =============  15. 可变元组  =============
type VT<T extends readonly unknown[]> = T;
type R1 = VT<[string, ...number[]]>;

// =============  16. 品牌类型  =============
declare const tag: unique symbol;
type USD = number & { [tag]: 'USD' };
const usd = 10 as USD;

// =============  17. 断言签名  =============
function assert(val: unknown): asserts val is string {
  if (typeof val !== 'string') throw 0;
}

// =============  18. const enum  =============
const enum Dir { Up = 1, Down = -1 }
const dir: Dir = Dir.Up;

// =============  19. 模板字面量 + 联合  =============
type Alignment = 'left' | 'right' | 'center';
type Margin = `margin-${Alignment}`;

// =============  20. 可变元组 + 标签  =============
type L = [first: string, ...rest: number[], last: boolean];

// =============  21. 静态索引签名  =============
type CSS = { [K in `--${string}`]: string | number };

// =============  22. 抽象构造签名  =============
abstract class Animal {}
type AnimalConstructor = abstract new (...args: any[]) => Animal;

// =============  23. satisfies（TS4.9+）  =============
const cfg = {
  port: 3000,
  host: '0.0.0.0'
} satisfies Record<string, string | number>;

// =============  24. in / out 修饰（TS5.0+）  =============
type Func<in T, out R> = (arg: T) => R;